package reflect;
/*
    反射：将不同类中的一些相同的部分封装为其他不同的对象，这就是反射机制
       理解：不再使用以前的创建对象的方法去进行对中的操作，而是通过Class类对象去对指定的类进行操作，就相当于使用Class类对象
            与指定的类建立了通道，从而使用Class类对象中的方法就可以对指定的类进行操作

    java程序分为三个阶段：源代码阶段---> Class类对象阶段（将字节码文件加载到内存中）-----> 运行时阶段（创建对象，new 类名）

    反射的优点：1.可以在程序的运行过程中（编译过程中），使用这些对象
               2.可以解耦，提高程序的可扩展性

    获取Class对象的方法：(会抛出异常)
        1.若在源代码阶段使用Class.forName("包名.类名")：将字节码文件加载到内存中，返回Class对象
            多用于配置文件。将类名定义为配置文件中，读取文件，加载类
        2.若在Class类对象阶段使用：类名.class：返回Class对象
            多用于参数的传递
        3.若在的运行时阶段使用：对象.getClass（）：需要先创建对象，这个方法属于Object类，所以所有对象都可以用
            多用于对象的获取字节码方式

    以上三个阶段结论：只要是同一个字节码文件（*.class:同一个类对象），在整个java程序运行过程中，不论以上哪种方式获取的Class对象，
                    都是相同的，不用类对象则不相同。

 */
public class PracticeMain {
    public static void main(String[] args) throws Exception{
        //  1.若在源代码阶段使用：class.foName("包名.类名")：将字节码文件加载到内存中，返回Class对象
        Class c1 = Class.forName("reflect.Dog");
        System.out.println(c1);

        // 2.若在Class类对象阶段使用：类名.class：返回Class对象
        Class c2 = Dog.class;
        System.out.println(c2);

        //3.若在的运行时阶段使用：对象.getClass（）：需要先创建对象，这个方法属于Object类，所以所有对象都可以用
        Dog dog = new Dog();
        Class c3 = dog.getClass();
        System.out.println(c3);

        //判断同一个字节码文件是否为同一个Class对象：
        System.out.println(c1==c2);
        System.out.println(c1==c3);

        //判断不同字节码文件是否为同一个Class对象：
        Class c4 = Class.forName("reflect.Cat");
        System.out.println(c1==c4);


    }
}
